iT邦幫忙

2024 iThome 鐵人賽

DAY 12
0
Software Development

一起看無間道學EdgeDB系列 第 12

[Day12] - 初始schema:地

  • 分享至 

  • xImage
  •  

Abstract object types

Place

Place為一abstract object type,只有一個必填的name property

abstract type Place {
    required name: str {
        delegated constraint exclusive;
    };
}

由於delegatedoverloaded是兩個初學者常常搞混的概念,在此一併說明。

Delegated

delegated是想將constraint的責任由本身放寬至後續所繼承的object type時使用。

考慮schema如下:

abstract type Place {
    required name: str {
        delegated constraint exclusive;
    };
}

type Landmark extending Place;
type Location extending Place;

Place object typename property使用delegatedconstraint exclusive放寬至後續extending它的Landmark object typeLocation object type身上。

舉例來說,假設name property為「"艾菲爾鐵塔"」,在沒有使用delegated的情況下,我們只能在LandmarkLocation兩個object type中,選擇一個來生成。換句話說,我們只能有name property為「"艾菲爾鐵塔"」的Landmark object或是name property為「"艾菲爾鐵塔"」的Location object,無法兩者並存。

但在使用delegated的情形下,我們可以同時擁有一個name property為「"艾菲爾鐵塔"」的Landmark object及一個name property為「"艾菲爾鐵塔"」的Location object

select (insert Landmark {name:="艾菲爾鐵塔"}) {name};
{default::Landmark {name: '艾菲爾鐵塔'}}
select (insert Location {name:="艾菲爾鐵塔"}) {name};
{default::Location {name: '艾菲爾鐵塔'}}

Overloaded

overloaded是針對所繼承的propertylink,想加入更嚴格的限制條件時使用。

考慮schema如下:

abstract type Person {
    name : str
}

type PersonWithLongName extending Person {
  overloaded name : str {
    constraint min_len_value(10)
  }
}

其中name propertyPerson中僅需要為str型態,而在PersonWithLongName中,我們使用overloaded更進一步限制其不只是要為str型態且長度不能小於10。

此時如果insert一個name property「"John"」的PersonWithLongName object

insert PersonWithLongName {name:="John"};

會報錯如下:

edgedb error: ConstraintViolationError: name must be no shorter than 10 characters.
Detail: violated constraint 'std::min_len_value' on property 'name' of object type 'default::PersonWithLongName'

如果insert一個name property為「"Christopher"」的PersonWithLongName object

select (insert PersonWithLongName {name:="Christopher"}) {name};

則可以順利生成:

{default::PersonWithLongName {name: 'Christopher'}}

Object types

Landmark

Landmark用來代表知名度較高的地標。

type Landmark extending Place;

Location

Location用來代表一般地點。

type Location extending Place;

Store

Store用來代表店鋪。

type Store extending Place;

參考資料

無間EdgeDB初始schema:地


上一篇
[Day11] - 初始schema:時
下一篇
[Day13] - 初始schema:事
系列文
一起看無間道學EdgeDB30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言